/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
 */

package com.aprointeractive.android.justwar.activity;

import java.util.UUID;

import org.apache.cordova.DroidGap;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import com.aprointeractive.android.justwar.R;
import com.aprointeractive.android.justwar.gcm.GCMRegistrar;

public class JustwarActivity extends DroidGap implements OnTouchListener {
	public static final String TAG = "JustWarActivity";

	private static final int MENU_INDEX_START = 0;
	private static final int MENU_INDEX_NONE = 0;
	private static final int MENU_INDEX_NEWS = 1;
	private static final int MENU_INDEX_MISSION = 2;
	private static final int MENU_INDEX_WAR = 3;
	private static final int MENU_INDEX_UNIT = 4;
	private static final int MENU_INDEX_BUILDING = 5;
	private static final int MENU_INDEX_GENERAL = 6;
	private static final int MENU_INDEX_END = 6;
	private static final int[] arryDisableList = {
			R.drawable.ui_footer_ui_btn_news_normal,
			R.drawable.ui_footer_ui_btn_mission_normal,
			R.drawable.ui_footer_ui_btn_war_normal,
			R.drawable.ui_footer_ui_btn_unit_normal,
			R.drawable.ui_footer_ui_btn_building_normal,
			R.drawable.ui_footer_ui_btn_general_normal };
	private static int[] arryEnableList = {
			R.drawable.ui_footer_ui_btn_news_touch,
			R.drawable.ui_footer_ui_btn_mission_touch,
			R.drawable.ui_footer_ui_btn_war_touch,
			R.drawable.ui_footer_ui_btn_unit_touch,
			R.drawable.ui_footer_ui_btn_building_touch,
			R.drawable.ui_footer_ui_btn_general_touch };
	public static boolean isTouch = true;

	private static Handler mHandler = new Handler();

	private RelativeLayout mMenuLayout = null;
	public static String UDID = null;
	public static DroidGap context = null;
	public static ImageButton[] btnMenu = new ImageButton[6];

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		super.loadUrl("file:///android_asset/www/index.html");
		
		this.setUserInterface();

		UDID = getDeviceUDID();
		context = this;
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		GCMRegistrar.onDestroy(this);
	}

	private void setUserInterface() {
		try {
			LinearLayout.LayoutParams webviewLayout = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
	        		ViewGroup.LayoutParams.FILL_PARENT);
			webviewLayout.weight = 11;
			
			this.root.setWeightSum(12);
			this.appView.setLayoutParams(webviewLayout);
			
			/*
			 * Native 버튼을 추가하기 위한 Inflater 작업
			 */
			LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			mMenuLayout = (RelativeLayout) inflater.inflate(
					R.layout.main, null);
			
			LinearLayout.LayoutParams menuLayout = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
			menuLayout.weight = 1;
			
			mMenuLayout.setLayoutParams(menuLayout);
		
			this.root.addView(mMenuLayout);
			this.appView.setOnTouchListener(this);

			for (int i = 0; i < 6; i++) {
				btnMenu[i] = (ImageButton) findViewById(R.justWarActivity.btnNews
						+ i);
			}
			
			super.getWindow().setFlags(
					WindowManager.LayoutParams.FLAG_FULLSCREEN,
					WindowManager.LayoutParams.FLAG_FULLSCREEN);

			this.getWindow()
					.setFlags(
							WindowManager.LayoutParams.FLAG_FULLSCREEN,
							WindowManager.LayoutParams.FLAG_FULLSCREEN
									| WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	/*
	 * 시스템 고유의 값을 조합하여 UDID를 임의로 생성함 이 UDID는 기기마다 고유하게 생성되며, 매번 같은 값을 지님
	 * 
	 * DeviceId와 유심칩의 번호를 조합하여 생성한다.
	 */
	private String getDeviceUDID() {
		String retValue = null;

		try {
			final TelephonyManager tm = (TelephonyManager) getBaseContext()
					.getSystemService(Context.TELEPHONY_SERVICE);

			final String tmDevice, tmSerial, androidId;
			tmDevice = "" + tm.getDeviceId();
			tmSerial = "" + tm.getSimSerialNumber();
			androidId = ""
					+ android.provider.Settings.Secure.getString(
							getContentResolver(),
							android.provider.Settings.Secure.ANDROID_ID);

			UUID deviceUuid = new UUID(androidId.hashCode(),
					((long) tmDevice.hashCode() << 32) | tmSerial.hashCode());

			String deviceId = deviceUuid.toString();

			Log.e("UniqueDeviceIDActivity", "UUID: " + deviceId);

			retValue = deviceId;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}

		return retValue;
	}

	/*
	 * 메뉴 버튼의 이벤트 리스너 하단에서 JSON타입의 메시지를 구성하여 어떤 버튼이 뉼렸는지를 확인하여 자바스크립트의 이벤트 리스너에
	 * 전달한다.
	 * 
	 * ex) 이 버튼을 누르면 gotomenu 함수 실행하면 될듯..
	 * 
	 * 함수의 도입부에 isTouch를 먼저 체크하는데 이 값에 따라 버튼 이벤트를 받을지 여부를 검사할 수 있다. 자바스크립트에서 터치를
	 * disable 하면 isTouch가 false가 되고, 버튼은 어떠한 동작도 수행하지 않는다.
	 */
	public void mButtonClick(View v) {
		if (isTouch) {
			JSONObject json;
			int index = 0;

			switch (v.getId()) {
			case R.justWarActivity.btnNews:
				index = MENU_INDEX_NEWS;
				break;
			case R.justWarActivity.btnMission:
				index = MENU_INDEX_MISSION;
				break;
			case R.justWarActivity.btnWar:
				index = MENU_INDEX_WAR;
				break;
			case R.justWarActivity.btnUnit:
				index = MENU_INDEX_UNIT;
				break;
			case R.justWarActivity.btnBuilding:
				index = MENU_INDEX_BUILDING;
				break;
			case R.justWarActivity.btnGeneral:
				index = MENU_INDEX_GENERAL;
				break;
			default:
				break;
			}// end switch

			try {
				json = new JSONObject().put("event", "menubutton");
				json.put("index", String.valueOf(index));
				sendJavascript(json, "COMMON_Event");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}// endif
	}

	/*
	 * This method send Javascript messgae to webpage. You called anywhere this
	 * method like 'JustWarActivity.sendJavascript(JSON object, String
	 * EventListener);'
	 * 
	 * 실행하고자 하는 자바스크립트 메시지를 보내는 함수 Json타입의 메시지와, 이벤트 리스너를 지정해 보내준다.
	 */
	public static void sendJavascript(JSONObject _json, String _eventCB) {
		try {
			String _d = "javascript:" + _eventCB + "(" + _json.toString() + ")";
			Log.v("Activity" + ":sendJavascript", _d);

			if (_eventCB != null) {
				context.sendJavascript(_d);
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	/*
	 * Application의 전체적인 터치를 제한하는 함수 BridgePlugin에서 호출된다. isTouch 변수를 통하여 웹뷰의
	 * 터치와 버튼의 터치를 제한할 수 있다.
	 */
	public static void setTouchState(boolean value) {
		isTouch = value;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see android.view.View.OnTouchListener#onTouch(android.view.View,
	 * android.view.MotionEvent)
	 * 
	 * 폰갭의 웹뷰 터치를 아래 오버라이딩 함수에 연결하여 터치를 처리함. return 타입에 따라 터치의 적용 여부를 관리할 수 있다.
	 * 
	 * true : 터치 미적용 false : 터치 적용
	 * 
	 * 유의해야 할 점은 false가 리턴되어야 터치 입력을 받는다는 점이 있다.
	 */
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		// TODO Auto-generated method stub
		return !isTouch;
	}

	/*
	 * 현재 메뉴 Index에 따라 버튼 이미지를 변경해주는 함수. 자바스크립트에서는 메뉴 Index가 1~6이지만 코드상에서 버튼은
	 * 배열로 관리되기 떄문에 Index가 0~5인 것에 주의해야함.
	 * 
	 * UI 변경은 메인 스레드에서 실행되야 하므로 Handler를 이용하여 이미지를 변경
	 */
	public static void controlMenuButton(final int index) {
		// 오래 걸리는 작업을 work 스레드에서 실행 함
		new Thread(new Runnable() {
			public void run() {
				// PorgressBar인스턴스 update 메시지를 메시지 큐에 등록
				mHandler.post(new Runnable() {
					public void run() {
						// work 스레드 내부에서 명령이 실행되는 것이 아니라
						// post(..)에 의해 메시지 큐에 추가됨.
						for (int i = 0; i < MENU_INDEX_END - MENU_INDEX_START; i++) {
							if (i + 1 == index)
								btnMenu[i].setImageResource(arryEnableList[i
										+ MENU_INDEX_START]);
							else
								btnMenu[i].setImageResource(arryDisableList[i
										+ MENU_INDEX_START]);

						}
					}
				});
			}
		}).start();
	}
}
